1,153 sales didn’t match to a block-lot in the real property table, which means that the block-lot jointly was not in the real prop table.
Also, there are about 16,000 properties in the real prop table that don’t have a neighborhood.
So after joining we end up with 9,428 sales that don’t have a neighborhood.
The real property table also gives if it is principal residence or not, so we’ll also filter for the sales that are for principal residences.
Bring in permit data
Observations: 836,816
Variables: 45
$ ID_Permit <int> 375642224, 375642225, 375642226, 375642227, 37...
$ csm_caseno <fct> 000000001, 000000002, 000000003, 000000004, 00...
$ csm_plan_year <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_plans_number <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_description <fct> issued through building inspection, install ga...
$ csm_expr_date <dttm> 1994-06-06, 1994-06-04, 1993-06-06, 1994-06-0...
$ csm_finaled_date <dttm> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
$ csm_issued_date <dttm> 1993-09-30, 1993-06-14, 1993-06-14, 1993-06-1...
$ csm_name_first <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_name_last <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_name_mi <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_projname <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_recd_by <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_recd_date <dttm> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
$ csm_status <fct> EXP, EXP, EXP, EXP, EXP, EXP, EXP, EXP, EXP, E...
$ csm_frozen <fct> N, N, N, N, N, N, N, N, N, N, F, N, N, N, N, N...
$ csm_auto_cond <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_updateby <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_updated <dttm> 2005-08-07, 2005-08-07, 2005-08-07, 2005-08-0...
$ csm_projno <fct> 000000001, 000000002, 000000003, 000000004, 00...
$ prc_avp_no <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ csm_target_date <dttm> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
$ case_type <fct> COM, COM, COM, COM, COM, COM, COM, COM, COM, C...
$ PLANADDRESS <fct> 0000 COUNTER, 1067 CAMERON ROAD, 4266 CLYDESDA...
$ prc_parcel_no <fct> 9948 948, 5142 034, 3575C010, 5164 022, 3355 0...
$ com_type_work <fct> OTH, OTH, AA, OTH, OTH, OTH, OTH, OTH, OTH, AA...
$ com_sprinklers <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ com_existing_use <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_type_work <fct> OTH, OTH, AA, OTH, OTH, OTH, OTH, OTH, OTH, AA...
$ csm_use <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ PlansNum <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_st_name <fct> COUNTER, CAMERON ROAD, CLYDESDALE AVE, KENILWO...
$ csm_st_number <fct> 0000, 1067, 4266, 5313, 2518, 4217, 3527, 0720...
$ csm_st_pfx <fct> NA, NA, NA, NA, NA, NA, NA, NA, E, NA, NA, NA,...
$ prc_block_no <fct> 9948 , 5142, 3575C, 5164, 3355, 5749, 5555, 76...
$ prc_lot <fct> 948, 034, 010, 022, 010, 017, 194, 036, 048, 0...
$ prc_neighborhood <fct> NA, CAMERON VILLAGE, MEDFIELD, KENILWORTH PARK...
$ PlanURL <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ prc_hi_dist <int> NA, 570, 540, 570, 672, 480, 470, 980, 551, 62...
$ csm_cost <dbl> 0, 2000, 2290, 1400, 6600, 5800, 4500, 5350, 7...
$ csm_mastno <fct> 000000001, 000000002, 000000003, 000000004, 00...
$ BlockLot <fct> 9948 948, 5142034, 3575C010, 5164022, 3355010,...
$ csm_id <fct> 200243175721, 200243175722, 200243175723, 2002...
$ Applicant <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ Lessee <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
LS0tDQp0aXRsZTogIlJlY2VudCBTYWxlcyBPdXRsaWVycyINCmF1dGhvcjogIkp1c3RpbiBFbHN6YXN6LCBNYXlvcidzIE9mZmljZSBvZiBJbm5vdmF0aW9uIg0KZW1haWw6ICJqdXN0aW4uZWxzemFzekBiYWx0aW1vcmVjaXR5LmdvdiINCmRhdGU6ICJUaHVyc2RheSwgRmVicnVhcnkgMjgsIDIwMTkiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgZmlnX2hlaWdodDogNQ0KICAgIGZpZ193aWR0aDogMTANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IFRSVUV9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEYsIGluY2x1ZGUgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA1KQ0KYGBgDQoNCg0KYGBge3J9DQpzb3VyY2UoIi4uL3NyYy8wMF9pbml0aWFsaXplLlIiKQ0Kc2FsZXMgPC0gbG9hZF9zYWxlc19kYXRhKGxvYWQuY2FjaGUgPSBUKQ0KDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoUlNvY3JhdGEpDQpsaWJyYXJ5KHNwKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShST0RCQykNCmxpYnJhcnkoaHRtbHRvb2xzKQ0KDQpyZWFsLnByb3AudXJsIDwtICJodHRwczovL2RhdGEuYmFsdGltb3JlY2l0eS5nb3YvcmVzb3VyY2UvNmFjdC1xenV5Lmpzb24iDQpyZWFsLnByb3AgPC0gcmVhZC5zb2NyYXRhKHJlYWwucHJvcC51cmwsIGFwcF90b2tlbiA9IFZBUlMkU09DUkFUQV9UT0tFTikNCg0KaG9vZHMgPC0gZ2V0X25laWdoYm9yaG9vZF9ib3VuZGFyaWVzKCkNCmhtdCA8LSBsb2FkX2Jsb2NrX2dyb3VwX2RhdGEobG9hZC5jYWNoZSA9IFQpDQpobXQuaG9vZCA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL3Jhdy9obXQvSE1UIGJ5IE5laWdoYm9yaG9vZCAyMDE3Lnhsc3giKQ0KDQpjb25uLmdpcyA8LSBvZGJjRHJpdmVyQ29ubmVjdCgNCiAgcGFzdGUwKA0KICAgICdkcml2ZXI9e09EQkMgRHJpdmVyIDEzIGZvciBTUUwgU2VydmVyfTsnLA0KICAgICdzZXJ2ZXI9JywgVkFSUyRFR0lTX1NFUlZFUiwgDQogICAgJzt1aWQ9JywgVkFSUyRFR0lTX1NFUlZFUl9VU0VSLA0KICAgICc7cHdkPScsVkFSUyRFR0lTX1NFUlZFUl9QV0QsIA0KICAgICc7ZGF0YWJhc2U9aG91c2luZzt0cnVzdGVkX2Nvbm5lY3Rpb249Tm8nKQ0KKQ0KDQpwZXJtaXRzIDwtIHNxbEZldGNoKGNvbm4uZ2lzLCAiaG91c2luZy50YmxfUGVybWl0IikNCg0KbXJpcy5yZWNlbnQgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9yYXcvc2FsZXMvTm92IDIwMTggLSBGZWIgMjAxOSBzYWxlcyBmb3IgSnVzdGluLnhsc3giKQ0KYGBgDQoNCkZpcnN0IG5lZWQgdG8gam9pbiB1cCB0aGUgcmVhbCBwcm9wZXJ0eSBkYXRhIChbT3BlbiBCYWx0aW1vcmVdKFtodHRwOi8vZGF0YS5iYWx0aW1vcmVjaXR5Lmdvdi9GaW5hbmNpYWwvUmVhbC1Qcm9wZXJ0eS1UYXhlcy8yN3c5LXVydHZ0bykpIHRoZSBzYWxlcyBkYXRhIChwcm92aWRlZCBieSBTdGV2ZSwgYW5kIHdpdGggKipkZWVkIGRhdGVzIGZyb20gSmFudWFyeSAxLCAyMDEwIHRocm91Z2ggT2N0b2JlciAyMDE4KiopIHNvIHdlIGhhdmUgYSBuZWlnaGJvcmhvb2QgZm9yIGFzIG1hbnkgc2FsZXMgYXMgd2UgY2FuLg0KDQpgYGB7cn0NCnNhbGVzIDwtIHNhbGVzICU+JSByZW5hbWUoc2FsZXMuYmxvY2sgPSBCbG9jaywgc2FsZXMubG90ID0gTG90KQ0KcmVhbC5wcm9wIDwtIHJlYWwucHJvcCAlPiUgcmVuYW1lKHJlYWwuYmxvY2sgPSBibG9jaywgcmVhbC5sb3QgPSBsb3QpDQpgYGANCg0KYGBge3J9DQpyZWFsLnByb3AgPC0gcmVhbC5wcm9wICU+JQ0KICBtdXRhdGUocmVhbC5ibG9jay5jbGVhbiA9IGdzdWIoIl4wKyIsICIiLCByZWFsLmJsb2NrKSwNCiAgICAgICAgIHJlYWwubG90LmNsZWFuID0gZ3N1YigiXjArIiwgIiIsIHJlYWwubG90KSkNCg0Kc2FsZXMgPC0gc2FsZXMgJT4lDQogIG11dGF0ZShzYWxlcy5ibG9jay5jbGVhbiA9IGdzdWIoIl4wKyIsICIiLCBzYWxlcy5ibG9jayksDQogICAgICAgICBzYWxlcy5sb3QuY2xlYW4gPSBnc3ViKCJeMCsiLCAiIiwgc2FsZXMubG90KSkNCmBgYA0KDQpgYGB7cn0NCnNhbGVzIDwtIHNhbGVzICU+JQ0KICBsZWZ0X2pvaW4ocmVhbC5wcm9wLCANCiAgICAgICAgICAgIGJ5ID0gYygic2FsZXMuYmxvY2suY2xlYW4iID0gInJlYWwuYmxvY2suY2xlYW4iLA0KICAgICAgICAgICAgICAgICAgICJzYWxlcy5sb3QuY2xlYW4iID0gInJlYWwubG90LmNsZWFuIikNCiAgICAgICAgICAgICkNCmBgYA0KDQpgYGB7cn0NCnNhbGVzICU+JSBjb3VudChpcy5uYShyZWFsLmJsb2NrKSwgaXMubmEocmVhbC5sb3QpKQ0KYGBgDQoNCjEsMTUzIHNhbGVzIGRpZG4ndCBtYXRjaCB0byBhIGJsb2NrLWxvdCBpbiB0aGUgcmVhbCBwcm9wZXJ0eSB0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYmxvY2stbG90IGpvaW50bHkgd2FzIG5vdCBpbiB0aGUgcmVhbCBwcm9wIHRhYmxlLiANCg0KQWxzbywgdGhlcmUgYXJlIGFib3V0IDE2LDAwMCBwcm9wZXJ0aWVzIGluIHRoZSByZWFsIHByb3AgdGFibGUgdGhhdCBkb24ndCBoYXZlIGEgbmVpZ2hib3Job29kLiANCg0KYGBge3J9DQpyZWFsLnByb3AgJT4lIGNvdW50KGlzLm5hKG5laWdoYm9yaG9vZCkpDQpgYGANCg0KU28gYWZ0ZXIgam9pbmluZyB3ZSBlbmQgdXAgd2l0aCA5LDQyOCBzYWxlcyB0aGF0IGRvbid0IGhhdmUgYSBuZWlnaGJvcmhvb2QuDQoNCmBgYHtyfQ0Kc2FsZXMgJT4lIGNvdW50KCFpcy5uYShuZWlnaGJvcmhvb2QpKQ0KYGBgDQoNClRoZSByZWFsIHByb3BlcnR5IHRhYmxlIGFsc28gZ2l2ZXMgaWYgaXQgaXMgcHJpbmNpcGFsIHJlc2lkZW5jZSBvciBub3QsIHNvIHdlJ2xsIGFsc28gZmlsdGVyIGZvciB0aGUgc2FsZXMgdGhhdCBhcmUgZm9yIHByaW5jaXBhbCByZXNpZGVuY2VzLg0KDQpgYGB7cn0NCnNhbGVzICU+JSBjb3VudChyZXNjb2RlKQ0KYGBgDQoNCkRpc3RyaWJ1dGlvbiBvZiBjaXR5LXdpZGUgMjAxOCBzYWxlcyBwcmljZXM6DQoNCmBgYHtyfQ0Kc2FsZXMgJT4lDQogIGZpbHRlcih5ZWFyKGRlZWQuZGF0ZSkgPT0gMjAxOCkgJT4lDQogIGdncGxvdChhZXMoYFNhbGVzIFByaWNlYCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oKSArDQogIHRoZW1lX2l0ZWFtX2dvb2dsZV9kb2NzKCkgKw0KICB4bGltKGMoMCwgNTAwMDAwKSkNCmBgYA0KDQpgYGB7cn0NCnF1YW50aWxlKHNhbGVzJGBTYWxlcyBQcmljZWAsIDAuODUpDQpgYGANCiANCiMgQnJpbmcgaW4gcGVybWl0IGRhdGENCg0KYGBge3J9DQpwZXJtaXRzICU+JSBnbGltcHNlKCkNCmBgYA0KDQpgYGB7cn0NCnBlcm1pdHMgJT4lIGNvdW50KGNzbV9zdGF0dXMpDQpgYGANCg0KYGBge3J9DQpwZXJtaXRzICU+JSBjb3VudChjc21fdHlwZV93b3JrKQ0KYGBgDQoNCiMgTmVpZ2hib3Job29kIFN1bW1hcnkgVGFibGUsIDIwMTUtMjAxNw0KDQpgYGB7cn0NCm1lZXQuY3JpdGVyaWEgPC0gc2FsZXMgJT4lDQogIGZpbHRlcih5ZWFyKGRlZWQuZGF0ZSkgJWluJSBjKDIwMTUsIDIwMTYsIDIwMTcpLA0KICAgICAgICAgIWlzLm5hKG5laWdoYm9yaG9vZCksDQogICAgICAgICBgSG93IENvbnZleWVkYCA9PSAxLA0KICAgICAgICAgIWdyZXBsKCJOT1QiLCByZXNjb2RlKSkgJT4lDQogIG5yb3cNCmBgYA0KDQpXZSBoYXZlIGByIG1lZXQuY3JpdGVyaWFgIHNhbXBsZXMgdG8gd29yayB3aXRoIHRoYXQgYXJlIGluIDIwMTUtMjAxNywgaGF2ZSBhIG5laWdoYm9yaG9vZCwgd2VyZSBhbiBhcm1zLWxlbmd0aCBzYWxlLCBhbmQgYXJlIHRoZSBwcmluY2lwYWwgcmVzaWRlbmNlLg0KDQpgYGB7cn0NCnNhbGVzLnN1bW1hcnkuMTVfMTcuYnkuaG9vZCA8LSBzYWxlcyAlPiUNCiAgZmlsdGVyKHllYXIoZGVlZC5kYXRlKSAlaW4lIGMoMjAxNSwgMjAxNiwgMjAxNyksDQogICAgICAgICAhaXMubmEobmVpZ2hib3Job29kKSwNCiAgICAgICAgIGBIb3cgQ29udmV5ZWRgID09IDEsDQogICAgICAgICAhZ3JlcGwoIk5PVCIsIHJlc2NvZGUpKSAlPiUNCiAgZ3JvdXBfYnkobmVpZ2hib3Job29kKSAlPiUNCiAgc3VtbWFyaXNlKGhvb2QubiA9IG4oKSwNCiAgICAgICAgICAgIGhvb2QubWVhbiA9IG1lYW4oYFNhbGVzIFByaWNlYCksDQogICAgICAgICAgICBob29kLm1lZGlhbiA9IG1lZGlhbihgU2FsZXMgUHJpY2VgKSwNCiAgICAgICAgICAgIGhvb2Quc3RkID0gc3FydChzdW0oKGBTYWxlcyBQcmljZWAtaG9vZC5tZWFuKV4yLyhob29kLm4tMSkpKSwNCiAgICAgICAgICAgIGhvb2QuOTV0aCA9IHF1YW50aWxlKGBTYWxlcyBQcmljZWAsIHByb2JzID0gLjk1KSwNCiAgICAgICAgICAgIGhvb2QuOTh0aCA9IHF1YW50aWxlKGBTYWxlcyBQcmljZWAsIHByb2JzID0gLjk4KSwNCiAgICAgICAgICAgIGhvb2QuOTl0aCA9IHF1YW50aWxlKGBTYWxlcyBQcmljZWAsIHByb2JzID0gLjk5KSkNCg0Kc2FsZXMuc3VtbWFyeS4xNV8xNy5ieS5ob29kICANCmBgYA0KDQpXaGljaCBuZWlnaGJvcmhvb2RzIGhhdmUgbGVzcyB0aGFuIDIwIHNhbGVzIG1lZXRpbmcgdGhlIGNyaXRlcmlhPw0KDQpgYGB7cn0NCnNhbGVzLnN1bW1hcnkuMTVfMTcuYnkuaG9vZCAlPiUNCiAgZmlsdGVyKGhvb2QubiA8IDIwKQ0KYGBgDQoNCjg0IG5laWdoYm9yaG9vZHMgaGF2ZSBsZXNzIHRoYW4gMjAgc2FsZXMgbWVldGluZyB0aGUgY3JpdGVyaWEuIFdlJ2xsIGV4Y2x1ZGUgdGhlbSBnb2luZyBmb3J3YXJkIHNvIHdlIGhhdmUgYSByZWFzb25hYmxlIHNhbXBsZSBzaXplLg0KDQpgYGB7cn0NCiMgSm9pbiB0aGUgc3VtbWFyaWVzIHRvIHRoZSBuZWlnaGJvcmhvb2QgYm91bmRhcmllcw0KaG9vZHNAZGF0YSA8LSBob29kc0BkYXRhICU+JSANCiAgbGVmdF9qb2luKHNhbGVzLnN1bW1hcnkuMTVfMTcuYnkuaG9vZCwNCiAgICAgICAgICAgIGJ5ID0gYygibGFiZWwiID0gIm5laWdoYm9yaG9vZCIpKQ0KYGBgDQoNCg0KIyA5OHRoIFBlcmNlbnRpbGUNCg0KIyMgQ3JpdGVyaWEgJiBSZXN1bHRzDQoNCmBgYHtyfQ0Kc2FsZXMuaG9vZC45OHRoIDwtIHNhbGVzICU+JQ0KICBsZWZ0X2pvaW4oc2FsZXMuc3VtbWFyeS4xNV8xNy5ieS5ob29kLA0KICAgICAgICAgICAgYnkgPSBjKCJuZWlnaGJvcmhvb2QiID0gIm5laWdoYm9yaG9vZCIpKSAlPiUNCiAgZmlsdGVyKHllYXIoZGVlZC5kYXRlKSA9PSAyMDE4LA0KICAgICAgICAgaG9vZC5uID49IDIwLA0KICAgICAgICAgYFNhbGVzIFByaWNlYCA+PSBob29kLjk4dGgsDQogICAgICAgICBgSG93IENvbnZleWVkYCA9PSAxLA0KICAgICAgICAgIWdyZXBsKCJOT1QiLCByZXNjb2RlKSkgJT4lDQogIGFycmFuZ2UobmVpZ2hib3Job29kKQ0KDQpyZXN1bHQuc2FsZXMgPC0gbnJvdyhzYWxlcy5ob29kLjk4dGgpDQpgYGANCg0KKipUaGVyZSBhcmUgYHIgcmVzdWx0LnNhbGVzYCBzYWxlcyB0aGF0IG1lZXQgdGhlIGZvbGxvd2luZyBjcml0ZXJpYToqKg0KDQotIERlZWQgZGF0ZSB3YXMgYmV0d2VlbiBKYW51YXJ5IDEsIDIwMTggYW5kIE9jdG9iZXIgNSwgMjAxOA0KLSBBcm1zLWxlbmd0aCBzYWxlDQotIFByaW5jaXBhbCByZXNpZGVuY2UNCi0gTmVpZ2hib3Job29kIGhhZCBhdCBsZWFzdCAyMCBzYWxlcw0KLSA5OHRoIHBlcmNlbnRpbGUgZm9yIHNhbGVzIHByaWNlcyBmb3IgdGhlaXIgbmVpZ2hib3Job29kLg0KDQooSWYgdGhpcyB5aWVsZCBpc24ndCBoaWdoIGVub3VnaCB3ZSBjYW4gYnVtcCBpdCBkb3duIHRvIHRoZSA5NXRoIHBlcmNlbnRpbGUuKQ0KDQoNCmBgYHtyfQ0Kc2FsZXMuaG9vZC45OHRoJGxvbmcgPC0gbGFwcGx5KHNhbGVzLmhvb2QuOTh0aCRsb2NhdGlvbi5jb29yZGluYXRlcywgZnVuY3Rpb24oeCkgeFsxXSkgJT4lIHVubGlzdCgpDQoNCnNhbGVzLmhvb2QuOTh0aCRsYXQgPC0gbGFwcGx5KHNhbGVzLmhvb2QuOTh0aCRsb2NhdGlvbi5jb29yZGluYXRlcywgZnVuY3Rpb24oeCkgeFsyXSkgJT4lIHVubGlzdCgpDQpgYGANCg0KDQpgYGB7cn0NCnNhbGVzLmhvb2QuOTh0aC5nZW8gPC0gc2FsZXMuaG9vZC45OHRoICU+JSBmaWx0ZXIoIWlzLm5hKGxvbmcpKQ0KICANCnNhbGVzLmhvb2QuOTh0aC5nZW8gPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZSgNCiAgc2FsZXMuaG9vZC45OHRoLmdlbyAlPiUgc2VsZWN0KGxvbmcsIGxhdCksIA0KICBzYWxlcy5ob29kLjk4dGguZ2VvLA0KICBwcm9qNHN0cmluZyA9IENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK25vX2RlZnMgK2VsbHBzPVdHUzg0ICt0b3dnczg0PTAsMCwwIikpDQoNCnNhbGVzLmhvb2QuOTh0aC5nZW8gPC0gDQogIHNwVHJhbnNmb3JtKA0KICAgIHNhbGVzLmhvb2QuOTh0aC5nZW8sIA0KICAgIENSU29iaiA9IENSUygiK2luaXQ9ZXBzZzo0MzI2ICtwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0ICtub19kZWZzICtlbGxwcz1XR1M4NCArdG93Z3M4ND0wLDAsMCIpDQogICAgKQ0KDQpgYGANCg0KIyMgTWFwDQoNCmBgYHtyfQ0KbGlicmFyeShodG1sdG9vbHMpDQoNCmhvb2RzLmxhYmVscyA8LSBwYXN0ZTAoDQogIGhvb2RzJGxhYmVsLA0KICAiPGJyPk1lZGlhbiBTYWxlcywgMjAxNS0yMDE3OiAiLCBhcy5jaGFyYWN0ZXIoaG9vZHMkaG9vZC5tZWRpYW4pDQogIA0KKQ0KDQpzYWxlLmxhYmVscyA8LSBwYXN0ZTAoDQogIHNhbGVzLmhvb2QuOTh0aC5nZW8kYEhvdXNlICNgLCAiICIsDQogIHNhbGVzLmhvb2QuOTh0aC5nZW8kYFN0cmVldCBOYW1lYCwgIiAiLA0KICBzYWxlcy5ob29kLjk4dGguZ2VvJFN1ZmZpeCwgDQogICI8YnI+U2FsZSBQcmljZSBpbiAyMDE4OiAiLCANCiAgYXMuY2hhcmFjdGVyKHNhbGVzLmhvb2QuOTh0aC5nZW8kYFNhbGVzIFByaWNlYCksDQogICI8YnI+TmV3IE93bmVyOiAiLCBzYWxlcy5ob29kLjk4dGguZ2VvJG5ldy5vd25lcg0KKQ0KDQoNCmxlYWZsZXQoKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtNzYuNiwgbGF0ID0gMzkuMywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSkgJT4lIA0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoaG9vZHMubGFiZWxzLCBIVE1MKSkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IHNhbGVzLmhvb2QuOTh0aC5nZW8sIA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDIsDQogICAgICAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KHNhbGUubGFiZWxzLCBIVE1MKSkNCmBgYA0KDQojIyBGdWxsIGxpc3QNCg0KYGBge3J9DQpzYWxlcy5ob29kLjk4dGggDQpgYGANCg0KIyBEZXRlY3QganVtcHMNCg0KYGBge3J9DQojbG9vayBmb3IgdGVtcG9yYWwganVtcHMgaW4gcHJpY2VzDQpgYGANCg0KIyA5OXRoIFBlcmNlbnRpbGUNCg0KIyMgQ3JpdGVyaWEgJiBSZXN1bHRzDQoNCmBgYHtyfQ0Kc2FsZXMuaG9vZC45OXRoIDwtIHNhbGVzICU+JQ0KICBsZWZ0X2pvaW4oc2FsZXMuc3VtbWFyeS4xNV8xNy5ieS5ob29kLA0KICAgICAgICAgICAgYnkgPSBjKCJuZWlnaGJvcmhvb2QiID0gIm5laWdoYm9yaG9vZCIpKSAlPiUNCiAgZmlsdGVyKHllYXIoZGVlZC5kYXRlKSA9PSAyMDE4LA0KICAgICAgICAgaG9vZC5uID49IDIwLA0KICAgICAgICAgYFNhbGVzIFByaWNlYCA+PSBob29kLjk5dGgsDQogICAgICAgICBgSG93IENvbnZleWVkYCA9PSAxLA0KICAgICAgICAgIWdyZXBsKCJOT1QiLCByZXNjb2RlKSkgJT4lDQogIGFycmFuZ2UobmVpZ2hib3Job29kKQ0KDQpyZXN1bHQuc2FsZXMgPC0gbnJvdyhzYWxlcy5ob29kLjk5dGgpDQpgYGANCg0KKipUaGVyZSBhcmUgYHIgcmVzdWx0LnNhbGVzYCBzYWxlcyB0aGF0IG1lZXQgdGhlIGZvbGxvd2luZyBjcml0ZXJpYToqKg0KDQotIERlZWQgZGF0ZSB3YXMgYmV0d2VlbiBKYW51YXJ5IDEsIDIwMTggYW5kIE9jdG9iZXIgNSwgMjAxOA0KLSBBcm1zLWxlbmd0aCBzYWxlDQotIFByaW5jaXBhbCByZXNpZGVuY2UNCi0gTmVpZ2hib3Job29kIGhhZCBhdCBsZWFzdCAyMCBzYWxlcw0KLSA5OXRoIHBlcmNlbnRpbGUgZm9yIHNhbGVzIHByaWNlcyBmb3IgdGhlaXIgbmVpZ2hib3Job29kLg0KDQooSWYgdGhpcyB5aWVsZCBpc24ndCBoaWdoIGVub3VnaCB3ZSBjYW4gYnVtcCBpdCBkb3duIHRvIHRoZSA5NXRoIHBlcmNlbnRpbGUuKQ0KDQoNCmBgYHtyfQ0Kc2FsZXMuaG9vZC45OXRoJGxvbmcgPC0gbGFwcGx5KHNhbGVzLmhvb2QuOTl0aCRsb2NhdGlvbi5jb29yZGluYXRlcywgZnVuY3Rpb24oeCkgeFsxXSkgJT4lIHVubGlzdCgpDQoNCnNhbGVzLmhvb2QuOTl0aCRsYXQgPC0gbGFwcGx5KHNhbGVzLmhvb2QuOTl0aCRsb2NhdGlvbi5jb29yZGluYXRlcywgZnVuY3Rpb24oeCkgeFsyXSkgJT4lIHVubGlzdCgpDQpgYGANCg0KDQpgYGB7cn0NCnNhbGVzLmhvb2QuOTl0aC5nZW8gPC0gc2FsZXMuaG9vZC45OXRoICU+JSBmaWx0ZXIoIWlzLm5hKGxvbmcpKQ0KICANCnNhbGVzLmhvb2QuOTl0aC5nZW8gPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZSgNCiAgc2FsZXMuaG9vZC45OXRoLmdlbyAlPiUgc2VsZWN0KGxvbmcsIGxhdCksIA0KICBzYWxlcy5ob29kLjk5dGguZ2VvLA0KICBwcm9qNHN0cmluZyA9IENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK25vX2RlZnMgK2VsbHBzPVdHUzg0ICt0b3dnczg0PTAsMCwwIikpDQoNCnNhbGVzLmhvb2QuOTl0aC5nZW8gPC0gDQogIHNwVHJhbnNmb3JtKA0KICAgIHNhbGVzLmhvb2QuOTl0aC5nZW8sIA0KICAgIENSU29iaiA9IENSUygiK2luaXQ9ZXBzZzo0MzI2ICtwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0ICtub19kZWZzICtlbGxwcz1XR1M4NCArdG93Z3M4ND0wLDAsMCIpDQogICAgKQ0KDQpgYGANCg0KIyMgTWFwDQoNCmBgYHtyfQ0KDQoNCmhvb2RzLmxhYmVscyA8LSBwYXN0ZTAoDQogIGhvb2RzJGxhYmVsLA0KICAiPGJyPk1lZGlhbiBTYWxlcywgMjAxNS0yMDE3OiAiLCBhcy5jaGFyYWN0ZXIoaG9vZHMkaG9vZC5tZWRpYW4pDQogIA0KKQ0KDQpzYWxlLmxhYmVscyA8LSBwYXN0ZTAoDQogIHNhbGVzLmhvb2QuOTl0aC5nZW8kYEhvdXNlICNgLCAiICIsDQogIHNhbGVzLmhvb2QuOTl0aC5nZW8kYFN0cmVldCBOYW1lYCwgIiAiLA0KICBzYWxlcy5ob29kLjk5dGguZ2VvJFN1ZmZpeCwgDQogICI8YnI+U2FsZSBQcmljZSBpbiAyMDE4OiAiLCANCiAgYXMuY2hhcmFjdGVyKHNhbGVzLmhvb2QuOTl0aC5nZW8kYFNhbGVzIFByaWNlYCksDQogICI8YnI+TmV3IE93bmVyOiAiLCBzYWxlcy5ob29kLjk5dGguZ2VvJG5ldy5vd25lcg0KKQ0KDQoNCmxlYWZsZXQoKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtNzYuNiwgbGF0ID0gMzkuMywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSkgJT4lIA0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoaG9vZHMubGFiZWxzLCBIVE1MKSkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IHNhbGVzLmhvb2QuOTl0aC5nZW8sIA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDIsDQogICAgICAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KHNhbGUubGFiZWxzLCBIVE1MKSkNCmBgYA0KDQpgYGB7cn0NCmVtaWx5Lmxpc3QgPC0gYygiNDAxMSBCQVJSSU5HVE9OIiwNCiAgICAgICAgICAgICAgICAiRE9SQ0hFU1RFUiIsDQogICAgICAgICAgICAgICAgIjIzMTkgTU9OVElDRUxMTyIpDQoNCnNhbGVzLmhvb2QuOTh0aC5nZW9AZGF0YSAlPiUgDQogIGZpbHRlcihncmVwbChwYXN0ZShlbWlseS5saXN0LCBjb2xsYXBzZT0ifCIpLCBwcm9wZXJ0eWFkZHJlc3MpKQ0KYGBgDQoNCiMgSW4gTWlkZGxlIE5laWdoYm9yaG9vZCwgOTl0aCBQZXJjZW50aWxlIGZvciBOZWlnaGJvcmhvb2QsIE92ZXIgJDI1MGssIE92ZXIgJDEwayBQZXJtaXQgQWN0aXZpdHkNCg0KVGhlIGZvbGxvd2luZyBjcml0ZXJpYSBhcmUgdXNlZCBiZWxvdzoNCg0KLSBEZWVkIGRhdGUgd2FzIGJldHdlZW4gSmFudWFyeSAxLCAyMDE4IGFuZCBPY3RvYmVyIDUsIDIwMTgNCi0gQXJtcy1sZW5ndGggc2FsZQ0KLSBQcmluY2lwYWwgcmVzaWRlbmNlDQotIE5laWdoYm9yaG9vZCBoYWQgYXQgbGVhc3QgMjAgc2FsZXMNCi0gOTl0aCBwZXJjZW50aWxlIGZvciBzYWxlcyBwcmljZXMgZm9yIHRoZWlyIG5laWdoYm9yaG9vZC4NCi0gU2FsZSBwcmljZSBvdmVyICQyNTAsMDAwDQotIFBlcm1pdHMgaXNzdWVkIGJldHdlZW4gMjAxNy0yMDE4DQotIFRvdGFsIHBlcm1pdCB2YWx1ZSBhdCBsZWFzdCAkMTAsMDAwDQoNCmBgYHtyfQ0KcGVybWl0cy5yZWNlbnQgPC0gcGVybWl0cyAlPiUgDQogIGZpbHRlcihjc21faXNzdWVkX2RhdGUgPj0gIjIwMTctMDEtMDEiKSAlPiUNCiAgbXV0YXRlKHBlcm1pdC5ibG9jay5jbGVhbiA9IGdzdWIoIl4wKyIsICIiLCBwcmNfYmxvY2tfbm8pLA0KICAgICAgICAgcGVybWl0LmxvdC5jbGVhbiA9IGdzdWIoIl4wKyIsICIiLCBwcmNfbG90KSkNCg0KcGVybWl0cy5yZWNlbnQuc3VtbWFyeSA8LSBwZXJtaXRzLnJlY2VudCAlPiUNCiAgZ3JvdXBfYnkocGVybWl0LmJsb2NrLmNsZWFuLCBwZXJtaXQubG90LmNsZWFuKSAlPiUNCiAgc3VtbWFyaXNlKHBlcm1pdC5jb3VudCA9IG4oKSwNCiAgICAgICAgICAgIHBlcm1pdC50b3RhbC52YWx1ZSA9IHN1bShjc21fY29zdCwgbmEucm0gPSBUKSkNCmBgYA0KDQpgYGB7cn0NCm1pZC5ob29kcyA8LSBobXQuaG9vZCAlPiUgZmlsdGVyKGBQcmVkb21pbmFudCBDb2RlIElnbm9yaW5nIE5vbi1SZXNpZGVudGlhbGAgJWluJSBjKCJEIiwgIkUiLCAiRiIsICJHIiwgIkgiKSkNCg0Kc2FsZXMuOTl0aC5taWQuaG9vZCA8LSBzdWJzZXQoc2FsZXMuaG9vZC45OXRoLmdlbywgdG9sb3dlcihuZWlnaGJvcmhvb2QpICVpbiUgdG9sb3dlcihtaWQuaG9vZHMkTmVpZ2hib3Job29kKSkNCg0Kc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsgPC0gc3Vic2V0KHNhbGVzLjk5dGgubWlkLmhvb2QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFNhbGVzIFByaWNlYCA+IDI1MDAwMCkNCmBgYA0KDQpgYGB7cn0NCnNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrQGRhdGEgJT4lIG5yb3cNCmBgYA0KDQoNCmBgYHtyfQ0Kc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGtAZGF0YSA8LSBzYWxlcy45OXRoLm1pZC5ob29kLm92ZXIuMjUwa0BkYXRhICU+JQ0KICBsZWZ0X2pvaW4ocGVybWl0cy5yZWNlbnQuc3VtbWFyeSwgDQogICAgICAgICAgICBieSA9IGMoInNhbGVzLmJsb2NrLmNsZWFuIiA9ICJwZXJtaXQuYmxvY2suY2xlYW4iLA0KICAgICAgICAgICAgICAgICAgICJzYWxlcy5sb3QuY2xlYW4iID0gInBlcm1pdC5sb3QuY2xlYW4iKSkNCmBgYA0KDQpGdXJ0aGVyIGZpbHRlciBmb3IgcGVybWl0IHZhbHVlIHRvdGFscyBvdmVyICQxMCwwMDAuDQoNCmBgYHtyfQ0Kc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCA8LSBzdWJzZXQoc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGssIHBlcm1pdC50b3RhbC52YWx1ZSA+PSAxMDAwMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KYGBgDQoNClJlc3VsdHMgaW4gMjcgcHJvcGVydGllcy4NCg0KYGBge3J9DQpzYWxlcy45OXRoLm1pZC5ob29kLm92ZXIuMjUway4xMGsucGVybWl0QGRhdGEgJT4lIG5yb3cNCmBgYA0KDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSIsIHdpZHRoID0gOH0NCg0KbWlkLmhvb2RzLmdlbyA8LSBzdWJzZXQoaG9vZHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgdG9sb3dlcihsYWJlbCkgJWluJSB0b2xvd2VyKG1pZC5ob29kcyROZWlnaGJvcmhvb2QpKQ0KDQoNCg0KbWlkLmhvb2RzLmxhYmVscyA8LSBwYXN0ZTAoDQogIG1pZC5ob29kcy5nZW8kbGFiZWwsDQogICI8YnI+TWVkaWFuIFNhbGVzLCAyMDE1LTIwMTc6ICIsIGFzLmNoYXJhY3RlcihtaWQuaG9vZHMuZ2VvJGhvb2QubWVkaWFuKQ0KICANCikNCg0Kc2FsZS5sYWJlbHMgPC0gcGFzdGUwKA0KICAiQW5hbHlzaXM6IFNEQVQgKHRocm91Z2ggT2N0b2JlciAxOCk8YnI+IiwNCiAgc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCRgSG91c2UgI2AsICIgIiwNCiAgc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCRgU3RyZWV0IE5hbWVgLCAiICIsDQogIHNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXQkU3VmZml4LCANCiAgIjxicj5TYWxlIFByaWNlIGluIDIwMTg6ICIsIA0KICBhcy5jaGFyYWN0ZXIoc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCRgU2FsZXMgUHJpY2VgKSwNCiAgIjxicj5OZXcgT3duZXI6ICIsIHNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXQkbmV3Lm93bmVyLA0KICAiPGJyPlBlcm1pdHMgSXNzdWVkIGZyb20gMjAxNy0yMDE4OiAiLCBzYWxlcy45OXRoLm1pZC5ob29kLm92ZXIuMjUway4xMGsucGVybWl0JHBlcm1pdC5jb3VudCwNCiAgIjxicj5Ub3RhbCBQZXJtaXQgVmFsdWUgZnJvbSAyMDE3LTIwMTg6ICIsIHNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXQkcGVybWl0LnRvdGFsLnZhbHVlDQopDQoNCg0KbGVhZmxldCgpICU+JQ0KICBzZXRWaWV3KGxuZyA9IC03Ni42LCBsYXQgPSAzOS4zLCB6b29tID0gMTEpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRTdGFtZW4uVG9uZXJMaXRlKSAlPiUgDQogIGFkZFBvbHlnb25zKGRhdGEgPSBob29kcywgDQogICAgICAgICAgICAgIHdlaWdodCA9IDIsIA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoaG9vZHMubGFiZWxzLCBIVE1MKSkgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSBtaWQuaG9vZHMuZ2VvLCANCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwgDQogICAgICAgICAgICAgICNjb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjAsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjIsDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KG1pZC5ob29kcy5sYWJlbHMsIEhUTUwpKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycyhkYXRhID0gc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCwgDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBpdGVhbS5jb2xvcnNbMV0sDQogICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID0gMiwNCiAgICAgICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoc2FsZS5sYWJlbHMsIEhUTUwpKQ0KYGBgDQoNCiMjIEZ1bGwgTGlzdA0KDQpgYGB7cn0NCnNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXRAZGF0YQ0KYGBgDQoNCiMgTVJJUyBkYXRhIE5vdiAyMDE4IC0gRmVicnVhcnkgMjAxOQ0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dtYXApDQpyZWdpc3Rlcl9nb29nbGUoU3lzLmdldGVudigiR09PR0xFX0dFT19LRVkiKSkNCmBgYA0KDQpgYGB7cn0NCmp1bGllLmxpc3QgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9yYXcvc2FsZXMvTm92IDIwMTggLSBGZWIgMjAxOSBzYWxlcyBmb3IgSnVzdGluLnhsc3giLCBzaGVldCA9IDIpDQpgYGANCg0KYGBge3J9DQpqdWxpZS5saXN0DQpgYGANCg0KYGBge3J9DQpqdWxpZS5saXN0Lmdlb2NvZGVkIDwtIGp1bGllLmxpc3QgJT4lDQogIG11dGF0ZShmdWxsLmFkZHJlc3MgPSBwYXN0ZTAoQWRkcmVzcywgIiwgQmFsdGltb3JlLCBNRCwgIiwgWmlwX0NvZGUpKSAlPiUNCiAgbXV0YXRlX2dlb2NvZGUoZnVsbC5hZGRyZXNzKQ0KDQpqdWxpZS5saXN0Lmdlb2NvZGVkDQoNCmBgYA0KDQoNCmBgYHtyfQ0KbXJpcy5yZWNlbnQgJT4lIGdsaW1wc2UoKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCm1yaXMucmVjZW50Lm91dGxpZXJzIDwtIG1yaXMucmVjZW50ICU+JQ0KICBsZWZ0X2pvaW4oc2FsZXMuc3VtbWFyeS4xNV8xNy5ieS5ob29kLA0KICAgICAgICAgICAgYnkgPSBjKCJOZWlnaGJvcmhvb2QiID0gIm5laWdoYm9yaG9vZCIpKSAlPiUNCiAgZmlsdGVyKGhvb2QubiA+PSAyMCwNCiAgICAgICAgIENsb3NlX1ByaWNlID49IGhvb2QuOTl0aCkgJT4lDQogIGFycmFuZ2UoTmVpZ2hib3Job29kKSAlPiUNCiAgbXV0YXRlKGZ1bGwuYWRkcmVzcyA9IHBhc3RlMChBZGRyZXNzLCAiLCBCYWx0aW1vcmUsIE1ELCAiLCBaaXBfQ29kZSkpICU+JQ0KICBtdXRhdGVfZ2VvY29kZShmdWxsLmFkZHJlc3MpDQoNCnNhdmVSRFMobXJpcy5yZWNlbnQub3V0bGllcnMsICIuLi9kYXRhL3Byb2Nlc3NlZC9NUklTX291dGxpZXJzX2dlb2NvZGVkLnJkcyIpDQpgYGANCg0KYGBge3J9DQptcmlzLnNhbGUubGFiZWxzIDwtIHBhc3RlMCgNCiAgIkFuYWx5c2lzOiBNUklTIChOb3YgMTggLSBGZWIgMTkpPGJyPiIsDQogIG1yaXMucmVjZW50Lm91dGxpZXJzJEFkZHJlc3MsDQogICI8YnI+U2FsZSBQcmljZSBpbiAyMDE4OiAiLCANCiAgYXMuY2hhcmFjdGVyKG1yaXMucmVjZW50Lm91dGxpZXJzJENsb3NlX1ByaWNlKSwNCiAgIjxicj5SZWNlbnQgUmVub3ZhdGlvbjogIiwgbXJpcy5yZWNlbnQub3V0bGllcnMkWWVhcl9SZW5vdmF0ZWQNCikNCg0KanVsaWUubGlzdC5sYWJlbHMgPC0gcGFzdGUwKA0KICAiSnVsaWUvSnVzdGluIExpc3Q8YnI+IiwNCiAganVsaWUubGlzdC5nZW9jb2RlZCRBZGRyZXNzLA0KICAiPGJyPlNhbGUgUHJpY2UgaW4gMjAxODogIiwgDQogIGFzLmNoYXJhY3RlcihqdWxpZS5saXN0JENsb3NlX1ByaWNlKSwNCiAgIjxicj5SZWNlbnQgUmVub3ZhdGlvbjogIiwganVsaWUubGlzdCRZZWFyX1Jlbm92YXRlZA0KKQ0KDQoNCmxlYWZsZXQoKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtNzYuNiwgbGF0ID0gMzkuMywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSkgJT4lIA0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoaG9vZHMubGFiZWxzLCBIVE1MKSkgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSBtaWQuaG9vZHMuZ2VvLCANCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwgDQogICAgICAgICAgICAgICNjb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjAsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjIsDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KG1pZC5ob29kcy5sYWJlbHMsIEhUTUwpKSAlPiUNCiAgICAgIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IGp1bGllLmxpc3QuZ2VvY29kZWQsDQoNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwNCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPSAyLA0KICAgICAgICAgICAgICAgICAgIGxhYmVsID0gfmxhcHBseShqdWxpZS5saXN0LmxhYmVscywgSFRNTCkpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBtcmlzLnJlY2VudC5vdXRsaWVycywNCg0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID0gMiwNCiAgICAgICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkobXJpcy5zYWxlLmxhYmVscywgSFRNTCkpICU+JQ0KICAgIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IHNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXQsIA0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaXRlYW0uY29sb3JzWzFdLA0KICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDIsDQogICAgICAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KHNhbGUubGFiZWxzLCBIVE1MKSkgDQoNCmBgYA0KDQoNCg0KDQoNCg==